package com.o2o.service.impl;

import com.o2o.dao.ProductDao;
import com.o2o.dao.ProductImgDao;
import com.o2o.dto.ImageHolder;
import com.o2o.dto.ProductExecution;
import com.o2o.entity.Product;
import com.o2o.entity.ProductImg;
import com.o2o.enums.ProductStateEnum;
import com.o2o.exceptions.ProductOperationException;
import com.o2o.service.ProductService;
import com.o2o.utils.ImageUtil;
import com.o2o.utils.PageCalculator;
import com.o2o.utils.PathUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * package_name:com.o2o.service.impl
 * Author:徐亚远
 * Date:2019/12/17 13:04
 * 项目名:o2o
 * Desription:
 **/
@Service
public class ProductServiceImpl implements ProductService {
    @Autowired
    private ProductDao productDao;
    @Autowired
    private ProductImgDao productImgDao;


    @Override
    public ProductExecution getProductList(Product productCondition, int pageIndex, int pageSize) {
       //页码转换成数据库的行码,并调用dao层取回指定页码的商品列表
        int rowIndex =  PageCalculator.calculateRowIndex(pageIndex,pageSize );
        List<Product> productList = productDao.queryProductList(productCondition, rowIndex, pageSize);
        //基于同样的查询条件返回该查询条件的商品总数
        int count = productDao.queryProductCount(productCondition);
        ProductExecution pe = new ProductExecution();
        pe.setProductList(productList);
        pe.setCount(count);
        return pe;
    }

    @Override
    @Transactional
    //1:处理缩略图,获取缩略图相对路径并赋值给product
    //2:往tb_product写入商品信息,获取productId
    //3:结合productId批量处理商品详情图
    //4：将商品详情图列表批量插入tb_product_img中
    public ProductExecution addProduct(Product product, ImageHolder thumbnail, List<ImageHolder> productImageHolderList) throws

            ProductOperationException {
       //控制判断
        if (product !=null && product.getShop() !=null&&product.getShop().getShopId() !=null){
          //给商品设置上默认属性
            product.setCreateTime(new Date());
            product.setLastEditTime(new Date());
         //默认为上架的状态
         product.setEnableStatus(1);
         //若商品缩略图不为空则添加
         if (thumbnail !=null){
            addThumbnail(product,thumbnail);
         }
         try {
             //创建商品信息
             int effectedNum = productDao.insertProduct(product);
             if (effectedNum <= 0){
                 throw new ProductOperationException("创建商品失败");
             }
         }catch (Exception e){
             throw new ProductOperationException("创建商品失败:"+e.toString());
         }
         //若商品详情图不为空则添加
            if (productImageHolderList !=null && productImageHolderList.size()>0){
             addProductImgList(product,productImageHolderList);
            }
            return new ProductExecution(ProductStateEnum.SUCCESS,product);
        }else {
            //传参为空则返回空值错误信息
            return new ProductExecution(ProductStateEnum.EMPTY);
        }
    }


    @Override
    @Transactional
    //1:若缩略图参数有值,则处理缩略图
    //2:若原先参在缩略图则先删除再添加新的缩略图,之后获取缩略图的相对路径并赋值给product
    //3:将tb_product_img下面的该商品原先的商品详情图记录全部删除
    //4:更新tb_product的信息
    public ProductExecution modifyProduct(Product product, ImageHolder thumbnail, List<ImageHolder> productImgList) throws ProductOperationException {
     //控制判断
        if (product !=null &&product.getShop()!=null
                &&product.getShop().getShopId()!=null){
            //给商品涉资默认属性
            product.setLastEditTime(new Date());
            //若商品缩略图不为空且原有缩略图不为空则删除原有缩略图并添加
            if(thumbnail !=null){
                //先获取一遍信息,因为原来的信息里有原有图片地址
                Product tempProduct = productDao.queryProductById(product.getProductId());
                if (tempProduct.getImgAddr()!=null){
                    ImageUtil.deleteFileOrPath(tempProduct.getImgAddr());
                }
                addThumbnail(product,thumbnail );
            }
            //如果有新存入的商品详情图,则将原先的删除,并添加新的图片
            if (productImgList !=null&&productImgList.size()>0){
                deleteProductImgList(product.getProductId());
                addProductImgList(product,productImgList );
            }
            try {
                //更新商品信息
                int effectedNum = productDao.updateProduct(product);
                if (effectedNum<=0){
                    throw new ProductOperationException("更新商品信息失败");
                }
                return new ProductExecution(ProductStateEnum.SUCCESS,product);
            }catch (Exception e){
                throw new ProductOperationException("更新商品信息失败:"+e.toString());
            }
         }else {
            return new ProductExecution(ProductStateEnum.EMPTY);
        }
    }

    @Override
    public Product getProductById(Long productId) {

        return productDao.queryProductById(productId);
    }

    /*
    *删除某个商品下的所有详情图
    * @param productId
    * */
    private void deleteProductImgList(Long productId){
        //根据producrId获取原来的图片
        List<ProductImg> productImgList = productImgDao.queryProductImgList(productId);
        //干掉原来的图片
        for (ProductImg productImg:productImgList){
            ImageUtil.deleteFileOrPath(productImg.getImgAddr());
        }
        //删除数据库里原有图片的信息
        productImgDao.deleteProductImgByProductId(productId);
    }

    /*
    * 添加缩略图
    * @param product
    * @param thumbnail
    * */
    private void addThumbnail(Product product, ImageHolder thumbnail){
        String dest = PathUtil.getShopImagePath(product.getShop().getShopId());
        String thumbnailAddr = ImageUtil.generateThumbnails(dest, thumbnail);
        product.setImgAddr(thumbnailAddr);
    }
    /*
    * 批量添加图片
    * @param product
    *@param productImgHolderList
    * */
    private void addProductImgList(Product product, List<ImageHolder> productImgHolderList){
       //获取图片存储路径,这里直接存放到相应店铺的文件夹底下
        String dest = PathUtil.getShopImagePath(product.getShop().getShopId());
        List<ProductImg> productImgList = new ArrayList<>();
        //遍历图片一次处理,并添加进productImg实体类里
        for (ImageHolder productImgHolder:productImgHolderList){
            String imgAddr = ImageUtil.generateThumbnails(dest,productImgHolder );
            ProductImg productImg = new ProductImg();
            productImg.setImgAddr(imgAddr);
            productImg.setProductId(product.getProductId());
            productImg.setCreateTime(new Date());
            productImgList.add(productImg);
        }
        //如果确实是有图片需要添加,就执行批量添加操作
        if (productImgList.size()>0){
            try {
                int effecteNum = productImgDao.batchInsertProductImg(productImgList);
                if (effecteNum<=0){
                    throw new ProductOperationException("创建商品详情图失败");
                }
            }catch (Exception e){
                throw new ProductOperationException("创建商品详情图失败:"+e.toString());
            }
        }
    }


}
